<!DOCTYPE html>
<title>Service Worker: notificationclick can open new WindowClient</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.js"></script>
<script>
if (window.testRunner)
    testRunner.setPermission('notifications', 'granted', location.origin, location.origin);

var t = async_test('notificationclick can open new WindowClient');
t.step(function() {
    var scope = 'resources/blank.html'
    service_worker_unregister_and_register(
        t, 'resources/notificationclick-can-openwindow.js', scope)
      .then(function(registration) {
          return wait_for_state(t, registration.installing, 'activated');
        })
      .then(function() { return with_iframe(scope); })
      .then(function(frame) {
          var w = frame.contentWindow;
          w.navigator.serviceWorker.onmessage = t.step_func(onMessage);
          w.navigator.serviceWorker.controller.postMessage('start');
        })
      .catch(unreached_rejection(t));

    var result = [];
    var expected = ['openWindow() outside of a notificationclick event failed',
                    'openWindow() in notificationclick outside of waitUntil but in stack succeeded',
                    'openWindow() in notificationclick outside of waitUntil not in stack failed',
                    'openWindow() in notificationclick\'s waitUntil suceeded',
                    'openWindow() called twice failed',
                    'openWindow() failed after timeout',
                    'openWindow() failed because a window was focused before'];

    function onMessage(e) {
      var message = e.data;

      if (typeof(message) === 'object') {
        if (message.type !== 'click')
          return;
        if (window.testRunner)
          testRunner.simulateWebNotificationClick(message.title);
        return;
      }

      if (message === 'quit') {
        assert_array_equals(result, expected,
                            'Worker should post back expected messages.');
        service_worker_unregister_and_done(t, scope);
      } else {
        result.push(message);
      }
    }
  });
</script>
